package org.example.listener.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.example.pojo.vo.EmployeeVO;

/**
 * 重要注意事项
 * 监听器单例问题：自定义的 AnalysisEventListener 不能被 Spring 容器管理为单例 Bean。每次读取 Excel 时都需要 new 一个新的实例，否则在并发环境下会出现数据错乱的问题。但可以通过它的构造方法传入由 Spring 管理的 Service 或 Component。
 * <p>
 * 资源关闭：使用基于文件路径的读取方式时，EasyExcel 会自动管理资源的关闭。如果使用 InputStream，在 doRead() 方法完成后，EasyExcel 也会自动处理流的关闭（版本 3.x 通常会自动关闭）。但如果你使用了 ExcelReader 对象，务必在 finally 块中调用 excelReader.finish() 来关闭资源，防止创建临时文件占用磁盘空间。
 * <p>
 * 事务边界：批量保存数据时，需要考虑事务的边界。你可以在 Service 方法上使用 @Transactional 注解，但要注意如果一次解析的数据量巨大，长时间的事务可能会占用数据库连接。有时可能更适合在监听器内部每批数据一个事务，或者采用其他方式管理事务。
 */
@Slf4j
public class EmpSheetDataListener extends AnalysisEventListener<EmployeeVO> {


    @Override
    public void invoke(EmployeeVO employeeVO, AnalysisContext analysisContext) {
        log.info(JSON.toJSONString(employeeVO));
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}
